# coding=utf8

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


class Preliminary:

    @staticmethod
    def demo_figure_set():
        plt.figure(num='figure set', figsize=(6, 3), dpi=200, facecolor='gray', edgecolor='blue', clear=False)
        plt.show()

    @staticmethod
    def demo_xylabel_set():
        x = np.linspace(-np.pi, np.pi, 100)
        y = np.sin(x)
        plt.figure('xylabel set')
        plt.xlabel('[-pi, pi]')	    # 设置横轴标签
        plt.ylabel('sin')	        # 设置纵轴标签
        plt.plot(x, y)

    @staticmethod
    def demo_legend_set():
        """
        该方法以三种方式生成图例：
        （1）自动探测各个绘图对象的类型和标签名称，生成图例中的标识。在该情况下可以不设置标签参数。如:
            legend()
        （2）设置标签序列，依次对应代替原绘图对象的标签。在该模式下，使用标签参数调用。如：
            legend(labels=['label1', 'label2', ...])
        （3）设置绘图对象和标签序列，分别指定绘图对象的标签。在该模式下，使用绘图对象和标签序列作为输入参数。如：
            legend(handles=[line1, line2, ...], labels=['label1', 'label2', ...])
        """
        x = np.linspace(-np.pi, np.pi, 100)
        y1 = np.sin(x)
        y2 = np.cos(x)
        plt.figure('legend set')
        plt.plot(x, y1, x, y2)
        plt.legend(labels=['sin', 'cos'])

    @staticmethod
    def demo_xylim_ticks_set():
        plt.figure(figsize=(8, 6))
        plt.xlim([0, 1])
        plt.ylim([0, 1])
        locs, labels = plt.xticks()
        print(locs)
        print(labels)
        plt.plot(np.linspace(0, 1, 20), np.sin(np.linspace(0, 1, 20)))
        plt.xticks(np.linspace(0, 1, 3), ['Tom', 'Dick', 'Sue'])
        plt.xticks([0, 0.5, 1], ['January', 'February', 'March'], rotation=20)
        plt.show()

    @staticmethod
    def demo_color_set():
        # 常用颜色表示方式展示
        # 颜色方案1
        # 基本颜色表：蓝色blue、绿色green、红色red、青色cyan、粉红色magenta、黄色yellow、黑色black、白色white。
        base_colors = ['blue', 'green', 'red', 'cyan', 'magenta', 'yellow', 'black', 'white']
        # 颜色方案2
        # XKCD颜色表： "xkcd:[xkcd颜色名称]“
        # 颜色方案3
        # CSS4颜色表：matplotlib.colors.CSSR_COLORS:: {colorname: "#xxyyzz"}
        # 颜色方案4
        # TABLEAU_COLORS/T10颜色表: matplotlib.colors.TABLEAU_COLORS:: {"tab:name": "#xxyyzz"}
        # 颜色方案5
        # 十六进制表示： “#RRGGBB”， “#RRGGBBAA”
        # 颜色方案6
        # 浮点数元组： （0.r, 0.g, 0.b[, 0.a]）

        # 使用基本颜色名称、十六进制颜色、浮点数颜色
        plt.figure('Base Colors', facecolor='#09ef08')
        plt.axes([.1, .1, .8, .8], facecolor=(0.5, 0.7, 0.2))
        plt.xlim(0, 2*np.pi)
        plt.ylim(-1.2, 1.2)
        x = np.linspace(0, 2*np.pi, 20)
        for j in range(8):
            y = np.cos(x+j*0.2)
            plt.plot(x, y, color=base_colors[j])
        plt.show()

        # 使用xkcd颜色名称
        plt.figure('xkcd')
        plt.plot([10, 35, 21], color='xkcd:orange')
        plt.show()

        # 使用CSS4颜色名称
        plt.figure('css4')
        plt.plot([10, 35, 21], color='deeppink')
        plt.show()

        # 使用浮点数元组表示颜色
        plt.figure('float 3-tuple')
        plt.plot([10, 35, 21], color=(0.5, 0.3, 0.8))
        plt.show()

        # 使用“C[int]”表示颜色
        # plot.rcParams [‘axes.prop_cycle’].by_key()[‘color’]
        plt.figure('float 3-tuple')
        cn_colors = ['C0', 'C3', 'C9']
        plt.pie([10, 35, 21], colors=cn_colors)
        plt.show()


def task():
    """
    根据下面给出的学生年龄（age）、身高（height）、体重（weight）数据，在同一个画板中，
    分别绘制：1）年龄为横轴、身高为竖轴的散点图；2）年龄为横轴、体重为竖轴的折线图。
    设置画板名称为“stu-data”，大小为（8，5），前景颜色为lightblue。
    设置散点图中点的颜色为红色，点的大小为50，
    折线图图的颜色为蓝色，折线的类型为虚线。
    X轴标签为age，Y轴标签为height，
    标题为age-height-weight，
    X轴的数据范围设置为10-20，Y轴数据范围设置为40-220。
    添加图例，标识身高（height）和体重（weight）的绘图。
    """
    df = pd.read_csv("stu85.csv", header=0, encoding='utf8')
    plt.figure(num='stu-data', figsize=(8, 5), facecolor='lightblue')
    plt.scatter(df.age, df.height, c='r', s=50)
    plt.plot(df.age, df.weight, 'b--')
    plt.xlabel('age')
    plt.title('age-height-weight')
    plt.xlim(10, 20)
    plt.ylim(40, 220)
    plt.legend(labels=["height", "weight"])
    plt.show()


def training():
    """
    在任务实现中，将绘制身高的折线图改为柱状图进行绘图
    """
    df = pd.read_csv("stu85.csv", header=0, encoding='utf8')

    plt.figure(num="stu-data", figsize=(6, 4), facecolor='lightblue')
    plt.scatter(x=df.age, y=df.height, s=50, c='rebeccapurple')
    plt.bar(df.age, df.weight, color='blue')
    plt.xlabel('age')
    plt.ylabel('height')
    plt.xlim(10, 20)
    plt.ylim(40, 220)
    plt.legend(labels=['height', 'weight'])
    plt.show()


if __name__ == "__main__":
    # Preliminary.demo_figure_set()
    # Preliminary.demo_xylabel_set()
    # Preliminary.demo_legend_set()
    # Preliminary.demo_xylim_ticks_set()
    # Preliminary.demo_color_set()
    task()
    # training()
